/**
 * Created on [2020/12/17 17:44] by huangcx
 * <p>
 * 项目名称: ecocivi
 * <p>
 * 本程序版权属于福建慧政通信息科技有限公司所有。
 * <p>
 * 任何组织和个人未经福建慧政通信息科技有限公司许可与授权,不得擅自传播、复制、更改该程序的内容。
 * 本程序受版权法和国际条约的保护。如未经授权而擅自复制或传播本程序(或其中任何部分),
 * 将受到严厉的刑事及民事制裁，并将在法律许可的范围内受到最大可能的起诉!
 * <p>
 * ©2020 福建慧政通信息科技有限公司
 */
package com.sunnada.btfvilg.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.sunnada.btfvilg.entity.User;

import java.util.Date;

/**
 * TODO
 *
 * @author 黄传烯
 */
public class JwtUtil {

    /**
     * token到期时间10小时
     */
    private static final long EXPIRE_TIME = 10 * 60 * 60 * 1000;
    /**
     * 密钥盐
     */
    private static final String TOKEN_SECRET = "btfvilg";

    /**
     * 获取token
     *
     * @param user 用户信息
     * @return token
     */
    public static String getToken(User user) {
        String token = null;
        try {
            Date expireAt = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            token = JWT.create()
                    //发行人
                    .withIssuer("auth0")
                    //存放数据
                    .withClaim("username", user.getUname())
                    //过期时间
                    .withExpiresAt(expireAt)
                    .sign(Algorithm.HMAC256(TOKEN_SECRET));
        } catch (IllegalArgumentException | JWTCreationException je) {
        }
        return token;
    }


    /**
     * 验证
     * @param token token
     * @return 是否通过
     */
    public static Boolean verify(String token) {
        try {
            //创建token验证器
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).withIssuer("auth0").build();
            jwtVerifier.verify(token);
        } catch (IllegalArgumentException | JWTVerificationException e) {
            //抛出错误即为验证不通过
            return false;
        }
        return true;
    }

    /**
     * 获取用户名
     * @param token token
     * @return 用户名
     */
    public static String getUsername(String token){
        //创建token验证器
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).withIssuer("auth0").build();
        DecodedJWT decodedJwt = jwtVerifier.verify(token);
        return  decodedJwt.getClaim("username").asString();
    }

}
